<?php
// +----------------------------------------------------------------------
// | MC PHP[基于ThinkPHP6.1开发]
// +----------------------------------------------------------------------
// | Copyright (c) 2020-2023 http://www.mingchangruanjian.com
// +----------------------------------------------------------------------
// | Author jokerfei [ jokerfei377@gmail.com ]
// +----------------------------------------------------------------------
// | 铭畅软件 技术部 出品
// +----------------------------------------------------------------------

namespace addons\DySms\controller;

require_once(dirname(__FILE__, 2) . "/sdk/vendor/autoload.php");

use Aliyun\Core\Config;
use Aliyun\Core\Profile\DefaultProfile;
use Aliyun\Core\DefaultAcsClient;
use Aliyun\Api\Sms\Request\V20170525\SendSmsRequest;
use Exception;

// // 加载区域结点配置
Config::load();

/**
 * sms控制器
 * @package addons\DySms\controller
 */
class DySms
{
    static $acsClient = null;

    /**
     * 取得AcsClient
     * @return DefaultAcsClient
     */
    public static function getAcsClient()
    {
        // 产品名称:云通信流量服务API产品,开发者无需替换
        $product = "Dysmsapi";

        // 产品域名,开发者无需替换
        $domain = "dysmsapi.aliyuncs.com";

        // AccessKeyId
        $accessKeyId = addons_config('DySms.appkey');

        // AccessKeySecret
        $accessKeySecret = addons_config('DySms.secret');

        // 暂时不支持多Region
        $region = "cn-hangzhou";

        // 服务结点
        $endPointName = "cn-hangzhou";

        if (static::$acsClient == null) {
            // 初始化acsClient,暂不支持region化
            $profile = DefaultProfile::getProfile($region, $accessKeyId, $accessKeySecret);

            // 增加服务结点
            DefaultProfile::addEndpoint($endPointName, $region, $product, $domain);

            // 初始化AcsClient用于发起请求
            static::$acsClient = new DefaultAcsClient($profile);
        }
        return static::$acsClient;
    }

    /**
     * 发送短信
     * @param string $rec_num 短信接收号码
     * @param array $sms_param 短信模板变量
     * @param string $sms_template 短信模板名称
     * @param string $sms_extend 上行短信扩展码（扩展码字段控制在7位或以下，无特殊需求用户请忽略此字段）
     *      公共回传参数，在“消息返回”中会透传回该参数；举例：用户可以传入自己下级的会员ID，
     *      在消息返回时，该会员ID会包含在内，用户可以根据该会员ID识别是哪位会员使用了你的应用
     * @return array
     *
     * 示例：
     * $result = addons_action('DySms/DySms/send', ['手机号码', [模板变量], '模板名称']);
     * if($result['code']){
     *     $this->error('发送失败，错误代码：'. $result['code']. ' 错误信息：'. $result['msg']);
     * } else {
     *     $this->success('发送成功');
     * }
     * @throws Exception
     */
    public static function send($rec_mobile = '', $sms_param = [], $sms_template = '', $sms_extend = '123456')
    {
        // 插件配置参数
        $config = addons_config('DySms');
        if ($config['appkey'] == '') {
            throw new Exception('请填写APPKEY');
        }
        if ($config['secret'] == '') {
            throw new Exception('请填写SECRET');
        }
        if ($rec_mobile == '') {
            throw new Exception('请填写短信接收号码');
        }
        if ($sms_template == '') {
            throw new Exception('没有设置短信模板');
        }
        $template = (new \app\admin\model\SystemAddonsConfig)->where("config_name", $sms_template)->where("addons_name",
            "DySms")->value("config");
        $template = json_decode($template, true);

        if (!$template) {
            throw new Exception('找不到短信模板');
        }
        // 模板参数
        if ($template['code'] == '') {
            throw new Exception('请设置模板ID');
        }
        if ($template['sign_name'] == '') {
            throw new Exception('请设置短信签名');
        }
        // 初始化SendSmsRequest实例用于设置发送短信的参数
        $request = new SendSmsRequest();

        // 必填，设置短信接收号码
        $request->setPhoneNumbers($rec_mobile);

        // 必填，设置签名名称，应严格按"签名名称"填写，请参考: https://dysms.console.aliyun.com/dysms.htm#/develop/sign
        $request->setSignName($template['sign_name']);

        // 必填，设置模板CODE，应严格按"模板CODE"填写, 请参考: https://dysms.console.aliyun.com/dysms.htm#/develop/template
        $request->setTemplateCode($template['code']);

        // 可选，设置模板参数, 假如模板中存在变量需要替换则为必填项
        $content = $template['content'];

        if (!empty($sms_param)) {
            $request->setTemplateParam(json_encode($sms_param, JSON_UNESCAPED_UNICODE));
            // 替换参数          
            $keys = array_keys($sms_param);
            foreach ($keys as $v) {
                $content = str_replace('${' . $v . '}', $sms_param[$v], $content);
            }
        }
        // 可选，设置流水号
        // $request->setOutId("yourOutId");
        // 选填，上行短信扩展码（扩展码字段控制在7位或以下，无特殊需求用户请忽略此字段）
        $request->setSmsUpExtendCode($sms_extend);
        // 发起访问请求
        $acsResponse = static::getAcsClient()->getAcsResponse($request);
        if ($acsResponse->Code != 'OK') {
            // 发送失败
            $msg = isset($acsResponse->Message) ? $acsResponse->Message : $acsResponse->Message;
            throw new Exception($acsResponse->Code . ":" . $msg);
        }
        return $content;
    }

}
